package main.request;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import utils.Debug;
import utils.FilesManage;
import main.process.FtpRequest;

public class RequestList implements ProcessRequestInterface {
	
	private static class SingletonHolder
	{		
		/** Instance unique non préinitialisée */
		private final static RequestList instance = new RequestList();
	}
	
	public static RequestList getInstance()
	{
		return SingletonHolder.instance;
	}

	@Override
	public void processRequest(String[] request, FtpRequest ftp) throws IOException {
		Debug.debug(this.getClass().getName(), request, ftp.getDebug());
		
		if(!request[0].equals("LIST"))
		{
			next(request, ftp);
		}
		else {
		// Definition des caracteres speciaux
		char plusSign = '\053';
		char tabSign = '\011';
		char end1 = '\015';
		char end2 = '\012';

		// Recuperation de la liste des fichiers
		ArrayList<File> files = FilesManage.getFiles(ftp.getPathName());

		StringBuilder sc = new StringBuilder();

		ftp.write("150 Data send begins\n");
		System.out.println("Sending data to server data socket");
		try {
			// Recuperation du socket de donnees
			if(ftp.getPassive())
			{

				/* Mode passif */
				ftp.setDataSocket(ftp.getPassiveServer().accept());

			}
			else
			{

			}

			// Ouverture d'un flux vers le socket de donnees
			ftp.setDataReader(new DataInputStream(ftp.getDataSocket().getInputStream()));
			ftp.setDataWriter(new DataOutputStream(ftp.getDataSocket().getOutputStream()));

			// Construction de chaque information de fichier a envoyer dans le flux, au format de FileZilla :
			// +factsFichier1	nomFichier
			// +factsFichier2	nomFichier2
			for(File f : files) {
				sc.append(plusSign);
				sc.append(FilesManage.buildFact('s', f));
				if(f.isDirectory())
					sc.append(FilesManage.buildFact('/', f));
				else
					sc.append(FilesManage.buildFact('r', f));
				sc.append(FilesManage.buildFact('m', f));
				sc.append(tabSign);
				sc.append(f.getName());
				// Saut de ligne (CR + LF)
				sc.append(end1);
				sc.append(end2);

			}
			System.out.println(sc.toString());

			// Envoi des donnees
			ftp.getDataWriter().writeBytes(sc.toString());
			ftp.myFlush();
			ftp.write("226 Data send OK\n");

			// Fermeture du flux
			ftp.getDataSocket().close();
			ftp.getPassiveServer().close();
			ftp.setPassiveFalse();
			System.out.println("Mode passif off");

			System.out.println("Data send ok");
		} catch (IOException e) {
			e.printStackTrace();
		}
		}
	}

	@Override
	public void next(String[] request, FtpRequest ftp) throws IOException {
		RequestPass.getInstance().processRequest(request, ftp);

	}

}
